#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

//定义双向链表节点的结构
typedef int LTDataType;
typedef struct ListNode
{
	LTDataType data;
	struct ListNode* next;
	struct ListNode* prev;
}LTNode;

//为了保持接口的一致性,优化接口都为一级指针
//初始化
void LTInit(LTNode** pphead);
//初始化函数的优化
LTNode* LTInitPro();
//销毁双向链表
//链表是整个都销毁,包括哨兵位,所以这里传二级
void LTDesTroy(LTNode** pphead);
//销毁函数的优化
void LTDesTroyPro(LTNode* phead);
//尾插
//第一个参数传一级还是二级,要看pphead指向的节点会不会发生改变
//如果发生改变,那么pphead的改变要影响实参,传二级指针
//如果不发生改变,pphead不会影响实参,传一级指针
void LTPushBack(LTNode* phead, LTDataType x);
//头插
void LTPushFront(LTNode* phead, LTDataType x);
//打印
void LTPrint(LTNode* phead);
//尾删
void LTPopBack(LTNode* phead);
//双向链表的判空
bool LTEmpty(LTNode* phead);
//头删
void LTPopFront(LTNode* phead);
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);
//删除指定位置数据
void LTErase(LTNode* pos);
//查找
LTNode* LTFind(LTNode* phead, LTDataType x);
